#include <bits/stdc++.h>
using namespace std;
int n, m, L, V, det[100010];
int fr[100010], to[100010], p;
struct uct{
    int f, t;
    bool vis;
}c[100010];
bool cmp(uct x, uct y){
    return x.t<y.t;
}
int main(){
    freopen ("detect.in","r",stdin);
    freopen ("detect.out","w",stdout);
    int T;
    scanf("%d", &T);
    while (T--){
        scanf("%d%d%d%d", &n, &m, &L, &V);
        for (int i=1; i<=n; i++){
            int d, v, a;
            scanf("%d%d%d", &d, &v, &a);
            if (a>0){
                if (v>V){
                    p++;
                    fr[p]=d;
                    to[p]=L;
                }
                else{
                    double S=(V*V-v*v)*1.0/(2*a);
                    if (d+S<=L){
                        p++; to[p]=L;
                        fr[p]=d+int(S)+1;
                    }
                }

            }
            else if (a==0){
                if (v>V){
                    p++;
                    fr[p]=d;
                    to[p]=L;
                }
            }
            else{
                double S=(V*V-v*v)*1.0/(2*a);
                if (S>0&&d+S<=L){
                    p++; fr[p]=d;
                    if (S==int(S)) to[p]=d+int(S)-1;
                    else to[p]=d+int(S);
                }
                else if (d+S>L){
                    p++;
                    fr[p]=d;
                    to[p]=L;
                }
            }
        }

        for (int i=1; i<=m; i++)
            scanf("%d", &det[i]);
        sort(det+1, det+m+1);
        for (int i=1; i<=p; i++) c[i].f=1000010;
        for (int i=1; i<=m; i++)
            for (int j=1; j<=p; j++)
                if (fr[j]<=det[i]&&to[j]>=det[i]){
                    c[j].f=min(c[j].f, i);
                    c[j].t=max(c[j].t, i);
                }
        int tot=p, ans=m;
        for (int i=1; i<=p; i++)
            if (c[i].t==0) c[i].vis=true, tot--;
        printf("%d ", tot);
        sort(c+1, c+p+1, cmp);

        //for (int i=1; i<=p; i++) cout << c[i].f << ' ' << c[i].t << endl;

        for (int i=1; i<=p; i++)
            if (!c[i].vis){
                ans--;
                //cout << i << endl;
                for (int j=i+1; j<=p; j++)
                    if (c[j].f<=c[i].t) c[j].vis=true;
            }
        printf("%d\n", ans);

        for (int i=1; i<=p; i++)
            fr[i]=0, to[i]=0, c[i].f=0, c[i].t=0, c[i].vis=false;
        p=0;
    }
    return 0;
}
